
#include <string.h>
#include <avr/io.h>
#include "lcd.h"

#ifndef F_CPU
 #define F_CPU 8000000UL
#endif

#include <util/delay.h>
#define delay(ms) _delay_ms(ms)

unsigned static volatile char *port;

void enable(void){
	*port |=0x01;
	delay(1);
	*port &=0xFE;
}


void dato_lcd(unsigned char dato){
	unsigned char temp;
	temp=dato;
	temp &= 0xF0;
	temp |=0x02;
	*port=temp;
	enable();
	temp=dato;
	temp<<=4;
	temp &= 0xF0;
	temp |=0x02;
	*port=temp;
	enable();
	delay(1); 
} 

void comando_lcd(unsigned char comando){
	unsigned char temp;

	temp=comando;
	temp &= 0xF0;
	*port=temp;
	enable();
	temp=comando;
	temp<<=4;
	temp &= 0xF0;
	*port=temp;
	enable();
	if(comando==1){
		delay(20);
	}
	delay(1);
}

void init_lcd(unsigned char *portLcd){

	port=portLcd;

	delay(100);
	//Comandos bus 4 bits
	comando_lcd(3);
	comando_lcd(3);
	comando_lcd(3);
	comando_lcd(2);
	
	//Otros comandos de configuracion
	comando_lcd(40);
	comando_lcd(8);
	comando_lcd(1);
	comando_lcd(6);
	comando_lcd(12);

}

/* CLS --> BORRAR PANTALLA LCD*/
void cls(void){
	comando_lcd(1);
}

/*POS_XY --> ASIGNAR POSICION EN LCD*/
void pos_xy(unsigned char x,unsigned char y){
	unsigned char temp;
	if(y>0)
		temp=x+0x40;
	else
		temp=x;
	temp |= 0x80;

	comando_lcd(temp);
}

/* CADENA_LCD --> ENVIAR TODA UNA CADENA AL LCD*/
void cadena_lcd(char cadena[]){
	unsigned char i;
	for(i=0;i<strlen(cadena);i++){
		dato_lcd(cadena[i]);
	}
}
